using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Package
{
    /// <summary>
    /// <para>Create Scene Layer Package</para>
    /// <para>Creates a scene layer package (.slpk file) from 3D points, multipatch features, or LAS  data.</para>
    /// <para>根据 3D 点、多面体要素或 LAS 数据创建场景图层包（.slpk 文件）。</para>
    /// </summary>    
    [DisplayName("Create Scene Layer Package")]
    public class CreateSceneLayerPackage : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateSceneLayerPackage()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_layer">
        /// <para>Input Layer</para>
        /// <para>The 3D points, multipatch feature layers, or LAS data (LAS, ZLAS, or LAZ) that will be used to create a scene layer package. LAS data can also be specified by selecting the parent folder that contains the desired files.</para>
        /// <para>将用于创建场景图层包的 3D 点、多面体要素图层或 LAS 数据（LAS、ZLAS 或 LAZ）。还可以通过选择包含所需文件的父文件夹来指定 LAS 数据。</para>
        /// </param>
        /// <param name="_out_slpk">
        /// <para>Output Scene Layer Package</para>
        /// <para>The output scene layer package (.slpk file).</para>
        /// <para>输出场景图层包（.slpk 文件）。</para>
        /// </param>
        public CreateSceneLayerPackage(object _in_layer, object _out_slpk)
        {
            this._in_layer = _in_layer;
            this._out_slpk = _out_slpk;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Scene Layer Package";

        public override string CallName => "management.CreateSceneLayerPackage";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_layer, _out_slpk, _attributes, _spatial_reference, _point_size_m, _xy_max_error_m, _z_max_error_m, _transform_method, _in_coordinate_system, _scene_layer_version.GetGPValue()];

        /// <summary>
        /// <para>Input Layer</para>
        /// <para>The 3D points, multipatch feature layers, or LAS data (LAS, ZLAS, or LAZ) that will be used to create a scene layer package. LAS data can also be specified by selecting the parent folder that contains the desired files.</para>
        /// <para>将用于创建场景图层包的 3D 点、多面体要素图层或 LAS 数据（LAS、ZLAS 或 LAZ）。还可以通过选择包含所需文件的父文件夹来指定 LAS 数据。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_layer { get; set; }


        /// <summary>
        /// <para>Output Scene Layer Package</para>
        /// <para>The output scene layer package (.slpk file).</para>
        /// <para>输出场景图层包（.slpk 文件）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Scene Layer Package")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_slpk { get; set; }


        /// <summary>
        /// <para>Attributes to Cache</para>
        /// <para><xdoc>
        ///   <para>The source data attributes to be included in the scene layer package. These values will be accessible when the content is consumed in other viewers. Select attributes are required for the desired rendering and filtering option (for example, intensity, returns, class codes, and RGB). To reduce storage, unneeded attributes should be excluded.</para>
        ///   <bulletList>
        ///     <bullet_item>Intensity— The return strength of the laser pulse for each lidar point.</bullet_item><para/>
        ///     <bullet_item>RGB—RGB imagery information collected for each lidar point.</bullet_item><para/>
        ///     <bullet_item>LAS flags—Classification and scan direction flags.</bullet_item><para/>
        ///     <bullet_item>Classification code—Classification code values.</bullet_item><para/>
        ///     <bullet_item>Return value—Discrete return number from the lidar pulse.</bullet_item><para/>
        ///     <bullet_item>User data—A customizable attribute that can be any number in the range from 0 through 255.</bullet_item><para/>
        ///     <bullet_item>Point source ID—For aerial lidar, this value typically identifies the flight path that collected a given lidar point.</bullet_item><para/>
        ///     <bullet_item>GPS time— The GPS time stamp at which the laser point was emitted from the aircraft. The time is in GPS seconds of the week.</bullet_item><para/>
        ///     <bullet_item>Scan angle—The angular direction of the laser scanner for a given lidar point. This value can range from -90 through 90.</bullet_item><para/>
        ///     <bullet_item>Near infrared—Near infrared records collected for each lidar point.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要包含在场景图层包中的源数据属性。当内容在其他查看器中使用时，将可以访问这些值。所需的渲染和过滤选项（例如，强度、返回值、类代码和 RGB）需要选择属性。为了减少存储，应排除不需要的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>强度— 每个激光雷达点的激光脉冲返回强度。</bullet_item><para/>
        ///     <bullet_item>RGB - 为每个激光雷达点采集的 RGB 影像信息。</bullet_item><para/>
        ///     <bullet_item>LAS 标志 - 分类和扫描方向标志。</bullet_item><para/>
        ///     <bullet_item>分类代码 - 分类代码值。</bullet_item><para/>
        ///     <bullet_item>返回值 - 来自激光雷达脉冲的离散返回编号。</bullet_item><para/>
        ///     <bullet_item>用户数据 - 可自定义的属性，可以是 0 到 255 范围内的任意数字。</bullet_item><para/>
        ///     <bullet_item>点源 ID - 对于航空激光雷达，此值通常用于标识收集给定激光雷达点的飞行路径。</bullet_item><para/>
        ///     <bullet_item>GPS 时间— 从飞机发射激光点的 GPS 时间戳。时间以一周的 GPS 秒为单位。</bullet_item><para/>
        ///     <bullet_item>扫描角度 - 给定激光雷达点的激光扫描仪的角度方向。此值的范围为 -90 到 90。</bullet_item><para/>
        ///     <bullet_item>近红外 - 为每个激光雷达点收集的近红外记录。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Attributes to Cache")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _attributes { get; set; } = null;


        /// <summary>
        /// <para>Output Coordinate System</para>
        /// <para><xdoc>
        ///   <para>The spatial reference of the output scene layer package. It can be any projected coordinate system or GCS_WGS_1984 but not a custom coordinate system. If a z-datum is defined, the linear unit must match that of the horizontal coordinate system. If the horizontal coordinate system is expressed in geographic coordinates, the z-datum must use meters.</para>
        ///   <para>A custom coordinate system is not supported for scene layers composed of points or 3D objects.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出场景图层包的空间参考。它可以是任何投影坐标系或GCS_WGS_1984但不能是自定义坐标系。如果定义了 z 基准，则线性单位必须与水平坐标系的线性单位匹配。如果水平坐标系以地理坐标表示，则 z 基准面必须使用米。</para>
        ///   <para>由点或 3D 对象组成的场景图层不支持自定义坐标系。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _spatial_reference { get; set; } = null;


        /// <summary>
        /// <para>Point Size (m)</para>
        /// <para>The point size of the lidar data. For airborne lidar data, the default of 0 or a value close to the average point spacing is usually best. For terrestrial lidar data, the point size should match the desired point spacing for the areas of interest. The default of 0 will automatically determine the best value for the input dataset.</para>
        /// <para>激光雷达数据的点大小。对于机载激光雷达数据，默认值 0 或接近平均点间距的值通常是最佳。对于地面激光雷达数据，点大小应与感兴趣区域所需的点间距相匹配。默认值为 0 将自动确定输入数据集的最佳值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Point Size (m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _point_size_m { get; set; } = 0;


        /// <summary>
        /// <para>XY Max Error_(m)</para>
        /// <para>The maximum x,y error tolerated. A higher tolerance will result in better data compression and more efficient data transfer. The default is 0.1.</para>
        /// <para>允许的最大 x，y 错误。更高的容差将导致更好的数据压缩和更高效的数据传输。默认值为 0.1。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("XY Max Error_(m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _xy_max_error_m { get; set; } = 0.01;


        /// <summary>
        /// <para>Z Max Error (m)</para>
        /// <para>The maximum z-error tolerated. A higher tolerance will result in better data compression and more efficient data transfer. The default is 0.1.</para>
        /// <para>允许的最大 z 误差。更高的容差将导致更好的数据压缩和更高效的数据传输。默认值为 0.1。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Max Error (m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_max_error_m { get; set; } = 0.01;


        /// <summary>
        /// <para>Geographic Transformation</para>
        /// <para>The datum transformation method that will be used when the input layer's spatial reference uses a datum that differs from the output coordinate system. All transformations are bidirectional, regardless of the direction implied by their names. For example, NAD_1927_to_WGS_1984_3 will work correctly even if the datum conversion is from WGS 1984 to NAD 1927.</para>
        /// <para>当输入图层的空间参考使用与输出坐标系不同的基准时，将使用的基准变换方法。所有转换都是双向的，无论其名称所暗示的方向如何。例如，即使基准面从 WGS 1984 转换为 NAD 1927，NAD_1927_to_WGS_1984_3 也能正常工作。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geographic Transformation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _transform_method { get; set; } = null;


        /// <summary>
        /// <para>Input Coordinate System</para>
        /// <para>The coordinate system of the input LAZ files. This parameter is only used for LAZ files that do not contain spatial reference information in their header or have a PRJ file.</para>
        /// <para>输入 LAZ 文件的坐标系。此参数仅用于标题中不包含空间参考信息或具有 PRJ 文件的 LAZ 文件。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_coordinate_system { get; set; } = null;


        /// <summary>
        /// <para>Scene Layer Version</para>
        /// <para><xdoc>
        ///   <para>The Indexed 3D Scene Layer (I3S) version of the resulting point cloud scene layer package. Specifying a version provides support for backward compatibility and allows scene layer packages to be shared with earlier versions of ArcGIS.</para>
        ///   <bulletList>
        ///     <bullet_item>1.x—Supported in all ArcGIS clients. This is the default.</bullet_item><para/>
        ///     <bullet_item>2.x—Supported in ArcGIS Pro 2.1.2 or later and can be published to ArcGIS Online and ArcGIS Enterprise 10.6.1 or later.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>生成的点云场景图层包的索引 3D 场景图层 （I3S） 版本。指定版本可提供向后兼容性支持，并允许与较早版本的 ArcGIS 共享场景图层包。</para>
        ///   <bulletList>
        ///     <bullet_item>1.x - 在所有 ArcGIS 客户端中都受支持。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>2.x - 在 ArcGIS Pro 2.1.2 或更高版本中受支持，并且可以发布到 ArcGIS Online 和 ArcGIS Enterprise 10.6.1 或更高版本。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Scene Layer Version")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _scene_layer_version_value? _scene_layer_version { get; set; } = null;

        public enum _scene_layer_version_value
        {
            /// <summary>
            /// <para>1.x</para>
            /// <para>1.x—Supported in all ArcGIS clients. This is the default.</para>
            /// <para>1.x - 在所有 ArcGIS 客户端中都受支持。这是默认设置。</para>
            /// </summary>
            [Description("1.x")]
            [GPEnumValue("1.X")]
            value0,

            /// <summary>
            /// <para>2.x</para>
            /// <para>2.x—Supported in ArcGIS Pro 2.1.2 or later and can be published to ArcGIS Online and ArcGIS Enterprise 10.6.1 or later.</para>
            /// <para>2.x - 在 ArcGIS Pro 2.1.2 或更高版本中受支持，并且可以发布到 ArcGIS Online 和 ArcGIS Enterprise 10.6.1 或更高版本。</para>
            /// </summary>
            [Description("2.x")]
            [GPEnumValue("2.X")]
            value1,

        }

        public CreateSceneLayerPackage SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}